package sim_moteur.factory;

import java.util.HashMap;
import java.util.Map;

import sim_moteur.element.animeaux.Animal;

public class AnimauxFactory extends AbstractFactory implements
		ChoseFactoryI<Animal> {

	public final static String ANIMAL_NAME = "Animal_";
	public final static String SUFFIX_VITALITE = ".initial.vie";
	public final static float VITALITE_ANIMAL_MIN = 5.0f;
	public final static float VITALITE_ANIMAL_MAX = 15.0f;

	private int compteur = 0;

	//private static ThreadLocal<AnimauxFactory> instance = new ThreadLocal<>();

	public AnimauxFactory(String simPrefix) {
		super(simPrefix);
		nombre = nombreAnimauxMax;
		
	}

	/**
	 * Retourne la seule instance de fabrique d'animaux. (singleton) Noter que
	 * chaque thread possède sa propre copie du singleton
	 * 
	 * @return la fabrique
	 */
//	public static AnimauxFactory getInstance(String simPrefix) {
//		if(instance.get()==null){
//			instance.set(new AnimauxFactory(simPrefix));
//		}
//		return instance.get();
//	}

	@Override
	public Animal get() {
		String nom = ANIMAL_NAME + compteur++ ;
		float vitalite = properties.getFloatProperty(nom + SUFFIX_VITALITE);
		if (vitalite < 0)
			vitalite = (int) ((Math.random() * VITALITE_ANIMAL_MAX - VITALITE_ANIMAL_MIN) + VITALITE_ANIMAL_MIN);

		Animal animal = new Animal(nom, vitalite, getPrefix());
		place(animal);

		nombre--;
		return animal;
	}


	/**
	 * Réinitialise la fabrique
	 */
//	public static void reset() {
//		String prefix = instance.get().getPrefix();
//		instance.set( new AnimauxFactory(prefix));
//	}

	/**
	 * On retrouve tous les animaux prévus dans le fichier de propriétés. Les
	 * animaux sont directement placés sur le terrain
	 */
	public Map<String, Animal> getAll() {
		Map<String, Animal> retMap = new HashMap<>();
		while (nombre > 0) {
			Animal nouvelAnimal = get();
			retMap.put(nouvelAnimal.getName(), nouvelAnimal);
		}
		return retMap;
	}

}
